package br.senai.sc.controller;

import java.io.ByteArrayInputStream;
import java.io.Serializable;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseId;
import javax.servlet.http.HttpSession;

import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

import br.senai.sc.dao.GenericDAOImp;
import br.senai.sc.entity.Edital;
import br.senai.sc.entity.Imagem;
import br.senai.sc.entity.ProdutoServico;
import br.senai.sc.util.SessionObjectDestroyer;

@ManagedBean
@SessionScoped
public class ProdutoServicoController implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = -5883399254962447114L;
	private ProdutoServico produtoServico;
	private Imagem imagem;
	private GenericDAOImp<?, ?> dao;
	private List<Imagem> imagens;
	private List<ProdutoServico> produtos;
	private StreamedContent image;

	@PostConstruct
	public void init() {
		if (produtos == null || produtos.isEmpty()) {
			produtos = dao.listAllByProperty(ProdutoServico.class, "ativo",
					true);
			imagens = dao.listAll(Imagem.class);
		}
	}

	public List<ProdutoServico> getProdutos() {
		produtos = dao.listAllByProperty(ProdutoServico.class, "ativo", true);
		imagens = dao.listAll(Imagem.class);
		return produtos;
	}

	public void setProdutos(List<ProdutoServico> produtos) {
		this.produtos = produtos;
	}

	public StreamedContent getImage() {
		if (image == null || imagem.getImagem().length < 0) {
			if (produtoServico != null && produtoServico.getDescricao() != null) {
				imagem = (Imagem) dao.listByProperty(Imagem.class,
						"produtoServico", produtoServico);
				image = new DefaultStreamedContent(new ByteArrayInputStream(
						imagem.getImagem()), "image/png");
			}
		}
		return image;

	}

	public void setImage(StreamedContent image) {
		this.image = image;
	}

	public List<Imagem> getImagens() {
		return imagens;
	}

	public void setImagens(List<Imagem> imagens) {
		this.imagens = imagens;
	}

	public ProdutoServico getProdutoServico() {
		return produtoServico;
	}

	public void setProdutoServico(ProdutoServico produtoServico) {
		this.produtoServico = produtoServico;
	}

	public Imagem getImagem() {
		return imagem;
	}

	public void setImagem(Imagem imagem) {
		this.imagem = imagem;
	}

	public GenericDAOImp getDao() {
		return dao;
	}

	public void setDao(GenericDAOImp dao) {
		this.dao = dao;
	}

	// CONSTRUTOR!
	public ProdutoServicoController() {
		dao = new GenericDAOImp();
		produtoServico = new ProdutoServico();
		imagem = new Imagem();
	}

	public void processFileUpload(FileUploadEvent uploadEvent) {
		try {
			imagem.setImagem(uploadEvent.getFile().getContents());
			image = new DefaultStreamedContent(new ByteArrayInputStream(
					imagem.getImagem()), "image/png");
		} catch (Exception ex) {
			ex.printStackTrace();
		}

	}

	@SuppressWarnings("finally")
	public String salvarProdutoServico() {
		try {
			produtoServico.setAtivo(true);
			if (produtoServico.getId() != null) {
				dao.merge(produtoServico);
			} else {
				dao.create(produtoServico);
			}
			imagem.setProdutoServico(produtoServico);
			if (imagem.getId() != null) {
				dao.merge(imagem);
			} else {
				dao.create(imagem);
			}

		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {

			produtoServico = new ProdutoServico();
			imagem = new Imagem();
			SessionObjectDestroyer.destroy();
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_INFO,
							"Produto/Servico Adicionado",
							"Produto/Servico Adicionado"));
			SessionObjectDestroyer.destroy();
			return "listarproduto";
		}
	}

	public String editar(ProdutoServico prods) {
		produtoServico = prods;
		dao = new GenericDAOImp();
		imagem = (Imagem) dao.listByProperty(Imagem.class, "produtoServico",
				produtoServico);
		return "editarprodutoservico";
	}

	public void remover() {
		produtoServico.setAtivo(false);
		dao = new GenericDAOImp();
		dao.merge(produtoServico);
		produtos = dao.listAllByProperty(ProdutoServico.class, "ativo", true);

	}

	public String cancelarProdutoServico() {
		image = null;
		return "listarproduto";
	}
}
